package com.edu.demo.config;

import cn.hutool.core.util.IdUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 对象存储工具
 */
@Data
@Configuration
//从配置文件中获取配置
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    public OSS getOssClient(){
        return new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
    }

    /**
     * 通用上传文件
     * @param file 文件
     * @param fileType 存放位置
     * @return  上传成功文件地址
     * @throws IOException 流异常
     */
    public String putObject(MultipartFile file,String fileType) throws IOException {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();

        // 获取当前日期和时间
        LocalDateTime now = LocalDateTime.now();
        // 创建一个日期时间格式器，用于格式化为"yyyyMMdd"
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        // 格式化当前日期和时间
        String time = now.format(formatter);


        // 获取时间戳
        //String time = String.valueOf(System.currentTimeMillis());
        //hutool获取uuid作为文件名
        String simpleUUID = IdUtil.simpleUUID();
        // 获取file的文件后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        // 文件名
        String objectName = time + "/" + fileType + "/" + simpleUUID + "." + suffix;
        // 获取上传文件的输入流
        InputStream inputStream = file.getInputStream();
        // 调用OOS SDK
        ossClient.putObject(bucketName, objectName, inputStream);
        // 断开链接
        ossClient.shutdown();
        return time + "/" + fileType + "/" + simpleUUID + "." + suffix;
    }

    /**
     * 通用下载文件
     * @param fileName 文件名
     * @return 文件输入流
     */
    public ByteArrayOutputStream getObject(String fileName) throws IOException {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();
        // 获取文件输入流
        InputStream inputStream = ossClient.getObject(bucketName, fileName).getObjectContent();

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        byte[] buffer = new byte[5 * 1024 * 1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        ossClient.shutdown();
        return outputStream;
    }

    /**
     * 删除文件
     * @param fileName 文件名
     */
    public void deleteObject(String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();
        // 删除文件。
        ossClient.deleteObject(bucketName, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    //查找OSS对象内的文件是否存在
    public boolean doesObjectExist(String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = getOssClient();
        // 判断文件是否存在。
        // 如果不存在，则返回false。
        boolean exists = ossClient.doesObjectExist(bucketName, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
        return exists;
    }

}
